﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Systemet.Views
{
    public partial class Produktkort : UserControl
    {
        private Domain.ProdukController pC;
        private bool Isnew;
        private SideViews.SideProduktkort sP;


        public Produktkort()
        {
            pC = new Domain.ProdukController();
            InitializeComponent();
            AccessController.Instance.MainView = this;

            gBPkInfo.Enabled = AccessController.Instance.UserRoleLoggedInUser.ProduktkortLäggTill;
            
            Uneditable();
            gBPkInfo.Enabled = AccessController.Instance.IntäktsbudgetUnlocked;
        }
        //För sidmeny
        public void UpdateProduktGrupper(IEnumerable<Produktgrupp> produktGrupper)
        {
            cmbProdGrupp.Items.Clear();
            foreach (Produktgrupp p in produktGrupper)
            {
                cmbProdGrupp.Items.Add(p.produktGruppNamn);
            }
        }

        public void UpdateProduktKategorier(IEnumerable<Produktkategori> produktKatergorier)
        {
            cmbProdKateg.Items.Clear();
            foreach (Produktkategori pk in produktKatergorier)
            {
                cmbProdKateg.Items.Add(pk.produktKategoriNamn);
            }
            
        }

        //Metod för att ta emot lista av produkter för insert i DGV
        //public void UpdateDGV(List<Produkt> produkter)
        public void UpdateDGV(string prodOmr, string prodKat, string prodGrupp, string prodNamn, string prodID)
        {
            pC = new Domain.ProdukController();
            if (dGVProdMain.Focused == false)
            {
                Uneditable();
                clearFields();

            }
            btnSparaProd.Enabled = false;
            dGVProdMain.DataSource = pC.updateProduktDGV(prodOmr,  prodKat,  prodGrupp,  prodNamn,  prodID);
            dGVProdMain.Columns[3].Visible = false;
            SetDefaultColumnSize();

        }

        //Sätter Defaultvärden till Columnerna i DGV
        private void SetDefaultColumnSize()
        {
            dGVProdMain.Columns[0].Width = 80;
            dGVProdMain.Columns[1].Width = 200;
            dGVProdMain.Columns[2].Width = 200;
            dGVProdMain.Columns[4].Width = 142;
            dGVProdMain.Columns["ProduktNamn"].HeaderText = "Produktnamn";
            dGVProdMain.Columns["ProduktGrupp"].HeaderText = "Produktgrupp";
            dGVProdMain.Columns["ProduktKategori"].HeaderText = "Produktkategori";
        }
        //Vid tryck av "Ny produkt", rensar och gör textfält editable
        private void btnNyProd_Click(object sender, EventArgs e)
        {
            clearFields();
            pC.ComboboxUpdate();
            Editable();
            
            tBProdNamn.Focus();
            Isnew = true;
            tBProdNamn.TabStop = true;
            cmbProdGrupp.TabStop = true;
            cmbProdKateg.TabStop = true;
            cmbProdOmrade.TabStop = true;
            cmbProdOmrade.SelectedIndex = -1;

        }
        //Låser upp fält
        private void Editable()
        {
            foreach (Control cB in gPProdinfo.Controls)
            {
                if (cB is ComboBox)
                {
                    cB.Enabled = true;
                }
            }

           
            tBProdNamn.Enabled = true;
            
        }
        //Låser fält
        private void Uneditable()
        {
            foreach (Control cB in gPProdinfo.Controls)
            {
                if (cB is ComboBox)
                {
                    cB.Enabled = false;
                }
            }
            
            tBProdNamn.Enabled = false;
            btnSparaProd.Enabled = false;

        }
        //Rensar fält
        private void clearFields()
        {

            foreach (Control tB in gPProdinfo.Controls)
            {
                if (tB is TextBox)
                {
                    tB.Text = "";
                }
             
            }


        }

        /// <summary>
        /// Spara ny produkt, lägger in alla värden i en dictionary för att sedan skickas till controller för validering
        /// om validering går igenom skapas ett produktobjekt och det läggs till i databasen.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSparaProd_Click(object sender, EventArgs e)
        {
            sP = (SideViews.SideProduktkort)AccessController.Instance.SidMeny;
            Dictionary<string, string> prodInfo = new Dictionary<string, string>();

            prodInfo.Add("prodid", tBProdID.Text);
            prodInfo.Add("prodnamn", tBProdNamn.Text);
            prodInfo.Add("prodgrupp", cmbProdGrupp.Text);
            prodInfo.Add("prodkategori", cmbProdKateg.Text);
            prodInfo.Add("prodomrade", cmbProdOmrade.Text);
            prodInfo.Add("andrad", DateTime.Now.ToString());
            prodInfo.Add("signerad", AccessController.Instance.LoggedInUser.UserName);

            //SKall valideras mot att det inte finns en med samma namn + inte för kort
            pC = new Domain.ProdukController();
            //if(pC.ValidateProdukt(prodInfo, Isnew)) 
            if (messageUpdatedObject("Produkt", pC.ValidateProdukt(prodInfo, Isnew)))
            {
                btnSparaProd.Enabled = false;
                sP.updateComboboxes();
                //pC.updateProduktDGV("", "", "", "", prodInfo["prodid"]);
                UpdateDGV("", "", "", "", prodInfo["prodid"]);
            }

            tBProdNamn.TabStop = false;
            cmbProdGrupp.TabStop = false;
            cmbProdKateg.TabStop = false;
            cmbProdOmrade.TabStop = false;
            
        }

        private void dGVProdMain_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            Isnew = false;
            clearFields();
            Uneditable();
            int currentRow = dGVProdMain.CurrentCell.RowIndex;

            if (dGVProdMain.Rows[currentRow].Cells[0].Value != null)
            {
                tBProdID.Text = dGVProdMain.Rows[currentRow].Cells[0].Value.ToString();
            }
            if (dGVProdMain.Rows[currentRow].Cells[1].Value != null)
            {
                tBProdNamn.Text = dGVProdMain.Rows[currentRow].Cells[1].Value.ToString();
            }
            if (dGVProdMain.Rows[currentRow].Cells[2].Value != null)
            {
                cmbProdGrupp.Text = dGVProdMain.Rows[currentRow].Cells[2].Value.ToString();
            }
            if (dGVProdMain.Rows[currentRow].Cells[5].Value != null)
            {
                cmbProdKateg.Text = dGVProdMain.Rows[currentRow].Cells[5].Value.ToString();
            }
            if (dGVProdMain.Rows[currentRow].Cells[4].Value != null)
            {
                if (dGVProdMain.Rows[currentRow].Cells[4].Value.ToString().Trim() == "Drift")
                {
                    cmbProdOmrade.SelectedIndex = 0;
                }
                if (dGVProdMain.Rows[currentRow].Cells[4].Value.ToString().Trim() == "Utv/Förv")
                {
                    cmbProdOmrade.SelectedIndex = 1;
                }
            }


            //ENDAST SYSTEMADMIN 
            
        }
        private void OnChanges(object sender, EventArgs e)
        {
            if (dGVProdMain.Focused == false)
            {
                if (tBProdNamn.Text.Length <= 2 || cmbProdGrupp.SelectedItem == null || cmbProdKateg.SelectedItem == null || cmbProdOmrade.SelectedItem == null)
                {
                    btnSparaProd.Enabled = false;
                }
                else
                {

                    btnSparaProd.Enabled = true;
                }
            }
        
        }

        private void btnAndraProd_Click(object sender, EventArgs e)
        {
            Editable();
            tBProdNamn.Focus();
            tBProdNamn.TabStop = true;
            cmbProdGrupp.TabStop = true;
            cmbProdKateg.TabStop = true;
            cmbProdOmrade.TabStop = true;
        }

        private void cBNyProdgrupp_CheckedChanged(object sender, EventArgs e)
        {
            if (cBNyProdgrupp.Checked)
            {
                cBNyProdkategori.Checked = false;
                fLPProdgrupp.Height = 120;
                btnSparaProdGrupp.Enabled = true;
                tbNyProdGrupp.Enabled = true;
                tbNyProdGrupp.Text = "";
                btnSparaProdGrupp.Enabled = false;

            }
            else
            {
                fLPProdgrupp.Height = 0;
            }
        }
        
        /// <summary>
        /// Spara events
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cBNyProdkategori_CheckedChanged(object sender, EventArgs e)
        {
            if (cBNyProdkategori.Checked)
            {
                cBNyProdgrupp.Checked = false;
                fLPProdkategori.Height = 120;
                btnSparaProdKategori.Enabled = true;
                textBoxProdKatNamn.Enabled = true;
                textBoxProdKatNamn.Text = "";
                btnSparaProdKategori.Enabled = false;
            }
            else
            {
                fLPProdkategori.Height = 0;
            }
        }
        private void tbNyProdGrupp_TextChanged(object sender, EventArgs e)
        {
            btnSparaProdGrupp.Enabled = pC.checkLenghtTextbox(tbNyProdGrupp.Text);
        }

        private void btnSparaProdGrupp_Click(object sender, EventArgs e)
        {
            messageUpdatedObject("produktgrupp", pC.newProduktGruppID(tbNyProdGrupp.Text));
            
            tbNyProdGrupp.Enabled = false;
            btnSparaProdGrupp.Enabled = false;
            pC.UpdateSideProdukter();
            

        }

        private void textBoxProdKatNamn_TextChanged(object sender, EventArgs e)
        {
            btnSparaProdKategori.Enabled = pC.checkLenghtTextbox(textBoxProdKatNamn.Text);
        }

        private void btnSparaProdKategori_Click(object sender, EventArgs e)
        {
            messageUpdatedObject("produktkategori", pC.ProduktKategoriSkapande(textBoxProdKatNamn.Text));
            
            textBoxProdKatNamn.Enabled = false;
            btnSparaProdKategori.Enabled = false;
            pC.UpdateSideProdukter();
        }
                    
        //Messagebox
        private bool messageUpdatedObject(string updatedObject, bool value)
        {
            if (value)
            {
                MessageBox.Show(("Ny " + updatedObject + " är skapad."), "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                   
                
                pC.ComboboxUpdate();
                if (updatedObject != "produktkategori" && updatedObject != "produktgrupp")
                {
                    Uneditable();
                }
                else
                {
                    Editable();
                }
                
                
                return true;
            }
            else
            {
                MessageBox.Show((updatedObject + " finns redan registrerad."), "Varning", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Editable();
                return false;
            }
        }

        private void gPProdinfo_Enter(object sender, EventArgs e)
        {

        }


    }
}